<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html 
     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
  <title>Class: Origami::Encryption::AES</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
  <meta http-equiv="Content-Script-Type" content="text/javascript" />
  <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" />
  <script type="text/javascript">
  // <![CDATA[

  function popupCode( url ) {
    window.open(url, "Code", "resizable=yes,scrollbars=yes,toolbar=no,status=no,height=150,width=400")
  }

  function toggleCode( id ) {
    if ( document.getElementById )
      elem = document.getElementById( id );
    else if ( document.all )
      elem = eval( "document.all." + id );
    else
      return false;

    elemStyle = elem.style;
    
    if ( elemStyle.display != "block" ) {
      elemStyle.display = "block"
    } else {
      elemStyle.display = "none"
    }

    return true;
  }
  
  // Make codeblocks hidden by default
  document.writeln( "<style type=\"text/css\">div.method-source-code { display: none }</style>" )
  
  // ]]>
  </script>

</head>
<body>



    <div id="classHeader">
        <table class="header-table">
        <tr class="top-aligned-row">
          <td><strong>Class</strong></td>
          <td class="class-name-in-header">Origami::Encryption::AES</td>
        </tr>
        <tr class="top-aligned-row">
            <td><strong>In:</strong></td>
            <td>
                <a href="../../../files/origami/encryption_rb.html">
                origami/encryption.rb
                </a>
        <br />
            </td>
        </tr>

        <tr class="top-aligned-row">
            <td><strong>Parent:</strong></td>
            <td>
                Object
            </td>
        </tr>
        </table>
    </div>
  <!-- banner header -->

  <div id="bodyContent">



  <div id="contextContent">

    <div id="description">
      <p>
Pure Ruby implementation of the <a href="AES.html">AES</a> symmetric
algorithm. Using mode CBC.
</p>

    </div>


   </div>

    <div id="method-list">
      <h3 class="section-bar">Methods</h3>

      <div class="name-list">
      <a href="#M000274">decrypt</a>&nbsp;&nbsp;
      <a href="#M000271">decrypt</a>&nbsp;&nbsp;
      <a href="#M000273">encrypt</a>&nbsp;&nbsp;
      <a href="#M000270">encrypt</a>&nbsp;&nbsp;
      <a href="#M000272">new</a>&nbsp;&nbsp;
      </div>
    </div>

  </div>


    <!-- if includes -->

    <div id="section">


    <div id="constants-list">
      <h3 class="section-bar">Constants</h3>

      <div class="name-list">
        <table summary="Constants">
        <tr class="top-aligned-row context-row">
          <td class="context-item-name">NROWS</td>
          <td>=</td>
          <td class="context-item-value">4</td>
        </tr>
        <tr class="top-aligned-row context-row">
          <td class="context-item-name">NCOLS</td>
          <td>=</td>
          <td class="context-item-value">4</td>
        </tr>
        <tr class="top-aligned-row context-row">
          <td class="context-item-name">BLOCKSIZE</td>
          <td>=</td>
          <td class="context-item-value">NROWS * NCOLS</td>
        </tr>
        <tr class="top-aligned-row context-row">
          <td class="context-item-name">ROUNDS</td>
          <td>=</td>
          <td class="context-item-value">{         16 =&gt; 10,         24 =&gt; 12,         32 =&gt; 14</td>
        </tr>
        <tr class="top-aligned-row context-row">
          <td class="context-item-name">SBOX</td>
          <td>=</td>
          <td class="context-item-value">[         0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,         0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,         0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,         0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,         0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,         0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,         0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,         0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,         0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,         0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,         0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,         0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,         0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,         0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,         0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,         0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16</td>
          <td width="3em">&nbsp;</td>
          <td class="context-item-desc">
Rijndael S-box

</td>
        </tr>
        <tr class="top-aligned-row context-row">
          <td class="context-item-name">RSBOX</td>
          <td>=</td>
          <td class="context-item-value">[         0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,         0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,         0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,         0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,         0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,         0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,         0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,         0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,         0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,         0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,         0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,         0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,         0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,         0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,         0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,         0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d</td>
          <td width="3em">&nbsp;</td>
          <td class="context-item-desc">
Inverse of the Rijndael S-box

</td>
        </tr>
        <tr class="top-aligned-row context-row">
          <td class="context-item-name">RCON</td>
          <td>=</td>
          <td class="context-item-value">[         0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a,         0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39,         0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a,         0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8,         0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef,         0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc,         0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b,         0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3,         0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94,         0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20,         0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63, 0xc6, 0x97, 0x35,         0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd, 0x61, 0xc2, 0x9f,         0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb, 0x8d, 0x01, 0x02, 0x04,         0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36, 0x6c, 0xd8, 0xab, 0x4d, 0x9a, 0x2f, 0x5e, 0xbc, 0x63,         0xc6, 0x97, 0x35, 0x6a, 0xd4, 0xb3, 0x7d, 0xfa, 0xef, 0xc5, 0x91, 0x39, 0x72, 0xe4, 0xd3, 0xbd,         0x61, 0xc2, 0x9f, 0x25, 0x4a, 0x94, 0x33, 0x66, 0xcc, 0x83, 0x1d, 0x3a, 0x74, 0xe8, 0xcb</td>
        </tr>
        </table>
      </div>
    </div>



    <div id="attribute-list">
      <h3 class="section-bar">Attributes</h3>

      <div class="name-list">
        <table>
        <tr class="top-aligned-row context-row">
          <td class="context-item-name">iv</td>
          <td class="context-item-value">&nbsp;[W]&nbsp;</td>
          <td class="context-item-desc"></td>
        </tr>
        </table>
      </div>
    </div>
      


    <!-- if method_list -->
    <div id="methods">
      <h3 class="section-bar">Public Class methods</h3>

      <div id="method-M000271" class="method-detail">
        <a name="M000271"></a>

        <div class="method-heading">
          <a href="#M000271" class="method-signature">
          <span class="method-name">decrypt</span><span class="method-args">(key, data)</span>
          </a>
        </div>
      
        <div class="method-description">
          <p><a class="source-toggle" href="#"
            onclick="toggleCode('M000271-source');return false;">[Source]</a></p>
          <div class="method-source-code" id="M000271-source">
<pre>
     <span class="ruby-comment cmt"># File origami/encryption.rb, line 624</span>
624:       <span class="ruby-keyword kw">def</span> <span class="ruby-constant">AES</span>.<span class="ruby-identifier">decrypt</span>(<span class="ruby-identifier">key</span>, <span class="ruby-identifier">data</span>)
625:         <span class="ruby-constant">AES</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">key</span>).<span class="ruby-identifier">decrypt</span>(<span class="ruby-identifier">data</span>)
626:       <span class="ruby-keyword kw">end</span>
</pre>
          </div>
        </div>
      </div>

      <div id="method-M000270" class="method-detail">
        <a name="M000270"></a>

        <div class="method-heading">
          <a href="#M000270" class="method-signature">
          <span class="method-name">encrypt</span><span class="method-args">(key, iv, data)</span>
          </a>
        </div>
      
        <div class="method-description">
          <p><a class="source-toggle" href="#"
            onclick="toggleCode('M000270-source');return false;">[Source]</a></p>
          <div class="method-source-code" id="M000270-source">
<pre>
     <span class="ruby-comment cmt"># File origami/encryption.rb, line 620</span>
620:       <span class="ruby-keyword kw">def</span> <span class="ruby-constant">AES</span>.<span class="ruby-identifier">encrypt</span>(<span class="ruby-identifier">key</span>, <span class="ruby-identifier">iv</span>, <span class="ruby-identifier">data</span>)
621:         <span class="ruby-constant">AES</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">key</span>, <span class="ruby-identifier">iv</span>).<span class="ruby-identifier">encrypt</span>(<span class="ruby-identifier">data</span>)
622:       <span class="ruby-keyword kw">end</span>
</pre>
          </div>
        </div>
      </div>

      <div id="method-M000272" class="method-detail">
        <a name="M000272"></a>

        <div class="method-heading">
          <a href="#M000272" class="method-signature">
          <span class="method-name">new</span><span class="method-args">(key, iv = nil)</span>
          </a>
        </div>
      
        <div class="method-description">
          <p><a class="source-toggle" href="#"
            onclick="toggleCode('M000272-source');return false;">[Source]</a></p>
          <div class="method-source-code" id="M000272-source">
<pre>
     <span class="ruby-comment cmt"># File origami/encryption.rb, line 628</span>
628:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">key</span>, <span class="ruby-identifier">iv</span> = <span class="ruby-keyword kw">nil</span>)
629:         <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">key</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">16</span> <span class="ruby-keyword kw">or</span> <span class="ruby-identifier">key</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">24</span> <span class="ruby-keyword kw">or</span> <span class="ruby-identifier">key</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">==</span> <span class="ruby-value">32</span>
630:           <span class="ruby-identifier">raise</span> <span class="ruby-constant">EncryptionError</span>, <span class="ruby-value str">&quot;Key must have a length of 128, 192 or 256 bits.&quot;</span>
631:         <span class="ruby-keyword kw">end</span>
632: 
633:         <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">not</span> <span class="ruby-identifier">iv</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">iv</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">!=</span> <span class="ruby-constant">BLOCKSIZE</span>
634:           <span class="ruby-identifier">raise</span> <span class="ruby-constant">EncryptionError</span>, <span class="ruby-node">&quot;Initialization vector must have a length of #{BLOCKSIZE} bytes.&quot;</span>
635:         <span class="ruby-keyword kw">end</span>
636: 
637:         <span class="ruby-ivar">@key</span> = <span class="ruby-identifier">key</span>
638:         <span class="ruby-ivar">@iv</span> = <span class="ruby-identifier">iv</span>
639:       <span class="ruby-keyword kw">end</span>
</pre>
          </div>
        </div>
      </div>

      <h3 class="section-bar">Public Instance methods</h3>

      <div id="method-M000274" class="method-detail">
        <a name="M000274"></a>

        <div class="method-heading">
          <a href="#M000274" class="method-signature">
          <span class="method-name">decrypt</span><span class="method-args">(data)</span>
          </a>
        </div>
      
        <div class="method-description">
          <p><a class="source-toggle" href="#"
            onclick="toggleCode('M000274-source');return false;">[Source]</a></p>
          <div class="method-source-code" id="M000274-source">
<pre>
     <span class="ruby-comment cmt"># File origami/encryption.rb, line 672</span>
672:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">decrypt</span>(<span class="ruby-identifier">data</span>)
673:         
674:         <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">data</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">%</span> <span class="ruby-constant">BLOCKSIZE</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
675:           <span class="ruby-identifier">puts</span> <span class="ruby-identifier">data</span>.<span class="ruby-identifier">size</span>
676:           <span class="ruby-identifier">hexprint</span> <span class="ruby-identifier">data</span>
677:           <span class="ruby-identifier">raise</span> <span class="ruby-constant">EncryptionError</span>, <span class="ruby-value str">&quot;Data must be 16-bytes padded&quot;</span>
678:         <span class="ruby-keyword kw">end</span>
679: 
680:         <span class="ruby-ivar">@iv</span> = <span class="ruby-identifier">data</span>.<span class="ruby-identifier">slice!</span>(<span class="ruby-value">0</span>, <span class="ruby-constant">BLOCKSIZE</span>)
681: 
682:         <span class="ruby-identifier">plain</span> = []
683:         <span class="ruby-identifier">plainblock</span> = []
684:         <span class="ruby-identifier">prev_cipherblock</span> = []
685:         <span class="ruby-identifier">nblocks</span> = <span class="ruby-identifier">data</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">/</span> <span class="ruby-constant">BLOCKSIZE</span>
686: 
687:         <span class="ruby-identifier">first_round</span> = <span class="ruby-keyword kw">true</span>
688:         <span class="ruby-identifier">nblocks</span>.<span class="ruby-identifier">times</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">n</span><span class="ruby-operator">|</span>
689:           <span class="ruby-identifier">cipherblock</span> = <span class="ruby-identifier">data</span>[<span class="ruby-identifier">n</span> <span class="ruby-operator">*</span> <span class="ruby-constant">BLOCKSIZE</span>, <span class="ruby-constant">BLOCKSIZE</span>].<span class="ruby-identifier">unpack</span>(<span class="ruby-value str">&quot;C*&quot;</span>)
690: 
691:           <span class="ruby-identifier">plainblock</span> = <span class="ruby-identifier">aesDecrypt</span>(<span class="ruby-identifier">cipherblock</span>)
692: 
693:           <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">first_round</span>
694:             <span class="ruby-constant">BLOCKSIZE</span>.<span class="ruby-identifier">times</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">i</span><span class="ruby-operator">|</span> <span class="ruby-identifier">plainblock</span>[<span class="ruby-identifier">i</span>] <span class="ruby-operator">^=</span> <span class="ruby-ivar">@iv</span>[<span class="ruby-identifier">i</span>] <span class="ruby-keyword kw">end</span>
695:           <span class="ruby-keyword kw">else</span>
696:             <span class="ruby-constant">BLOCKSIZE</span>.<span class="ruby-identifier">times</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">i</span><span class="ruby-operator">|</span> <span class="ruby-identifier">plainblock</span>[<span class="ruby-identifier">i</span>] <span class="ruby-operator">^=</span> <span class="ruby-identifier">prev_cipherblock</span>[<span class="ruby-identifier">i</span>] <span class="ruby-keyword kw">end</span>
697:           <span class="ruby-keyword kw">end</span>
698: 
699:           <span class="ruby-identifier">first_round</span> = <span class="ruby-keyword kw">false</span>
700:           <span class="ruby-identifier">prev_cipherblock</span> = <span class="ruby-identifier">cipherblock</span>
701:           <span class="ruby-identifier">plain</span>.<span class="ruby-identifier">concat</span>(<span class="ruby-identifier">plainblock</span>)
702:         <span class="ruby-keyword kw">end</span>
703:       
704:         <span class="ruby-identifier">padlen</span> = <span class="ruby-identifier">plain</span>[<span class="ruby-value">-1</span>]
705:         <span class="ruby-keyword kw">unless</span> (<span class="ruby-value">1</span><span class="ruby-operator">..</span><span class="ruby-value">16</span>) <span class="ruby-operator">===</span> <span class="ruby-identifier">padlen</span>
706:           <span class="ruby-identifier">raise</span> <span class="ruby-constant">EncryptionError</span>, <span class="ruby-value str">&quot;Incorrect padding byte&quot;</span>
707:         <span class="ruby-keyword kw">end</span>
708: 
709:         <span class="ruby-identifier">padlen</span>.<span class="ruby-identifier">times</span> <span class="ruby-keyword kw">do</span> 
710:           <span class="ruby-identifier">pad</span> = <span class="ruby-identifier">plain</span>.<span class="ruby-identifier">pop</span>
711:           <span class="ruby-identifier">raise</span> <span class="ruby-constant">EncryptionError</span>, <span class="ruby-value str">&quot;Incorrect padding byte&quot;</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">pad</span> <span class="ruby-operator">!=</span> <span class="ruby-identifier">padlen</span>
712:         <span class="ruby-keyword kw">end</span>
713: 
714:         <span class="ruby-identifier">plain</span>.<span class="ruby-identifier">pack</span>(<span class="ruby-value str">&quot;C*&quot;</span>)
715:       <span class="ruby-keyword kw">end</span>
</pre>
          </div>
        </div>
      </div>

      <div id="method-M000273" class="method-detail">
        <a name="M000273"></a>

        <div class="method-heading">
          <a href="#M000273" class="method-signature">
          <span class="method-name">encrypt</span><span class="method-args">(data)</span>
          </a>
        </div>
      
        <div class="method-description">
          <p><a class="source-toggle" href="#"
            onclick="toggleCode('M000273-source');return false;">[Source]</a></p>
          <div class="method-source-code" id="M000273-source">
<pre>
     <span class="ruby-comment cmt"># File origami/encryption.rb, line 641</span>
641:       <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">encrypt</span>(<span class="ruby-identifier">data</span>)
642: 
643:         <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@iv</span>.<span class="ruby-identifier">nil?</span>
644:           <span class="ruby-identifier">raise</span> <span class="ruby-constant">EncryptionError</span>, <span class="ruby-value str">&quot;No initialization vector has been set.&quot;</span>
645:         <span class="ruby-keyword kw">end</span>
646:         
647:         <span class="ruby-identifier">padlen</span> = <span class="ruby-constant">BLOCKSIZE</span> <span class="ruby-operator">-</span> (<span class="ruby-identifier">data</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">%</span> <span class="ruby-constant">BLOCKSIZE</span>)
648:         <span class="ruby-identifier">data</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">padlen</span>.<span class="ruby-identifier">chr</span> <span class="ruby-operator">*</span> <span class="ruby-identifier">padlen</span>)
649: 
650:         <span class="ruby-identifier">cipher</span> = []
651:         <span class="ruby-identifier">cipherblock</span> = []
652:         <span class="ruby-identifier">nblocks</span> = <span class="ruby-identifier">data</span>.<span class="ruby-identifier">size</span> <span class="ruby-operator">/</span> <span class="ruby-constant">BLOCKSIZE</span>
653: 
654:         <span class="ruby-identifier">first_round</span> = <span class="ruby-keyword kw">true</span>
655:         <span class="ruby-identifier">nblocks</span>.<span class="ruby-identifier">times</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">n</span><span class="ruby-operator">|</span>
656:           <span class="ruby-identifier">plainblock</span> = <span class="ruby-identifier">data</span>[<span class="ruby-identifier">n</span> <span class="ruby-operator">*</span> <span class="ruby-constant">BLOCKSIZE</span>, <span class="ruby-constant">BLOCKSIZE</span>].<span class="ruby-identifier">unpack</span>(<span class="ruby-value str">&quot;C*&quot;</span>)
657: 
658:           <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">first_round</span>
659:             <span class="ruby-constant">BLOCKSIZE</span>.<span class="ruby-identifier">times</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">i</span><span class="ruby-operator">|</span> <span class="ruby-identifier">plainblock</span>[<span class="ruby-identifier">i</span>] <span class="ruby-operator">^=</span> <span class="ruby-ivar">@iv</span>[<span class="ruby-identifier">i</span>] <span class="ruby-keyword kw">end</span>
660:           <span class="ruby-keyword kw">else</span>
661:             <span class="ruby-constant">BLOCKSIZE</span>.<span class="ruby-identifier">times</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">i</span><span class="ruby-operator">|</span> <span class="ruby-identifier">plainblock</span>[<span class="ruby-identifier">i</span>] <span class="ruby-operator">^=</span> <span class="ruby-identifier">cipherblock</span>[<span class="ruby-identifier">i</span>] <span class="ruby-keyword kw">end</span>
662:           <span class="ruby-keyword kw">end</span>
663: 
664:           <span class="ruby-identifier">first_round</span> = <span class="ruby-keyword kw">false</span>
665:           <span class="ruby-identifier">cipherblock</span> = <span class="ruby-identifier">aesEncrypt</span>(<span class="ruby-identifier">plainblock</span>)
666:           <span class="ruby-identifier">cipher</span>.<span class="ruby-identifier">concat</span>(<span class="ruby-identifier">cipherblock</span>)
667:         <span class="ruby-keyword kw">end</span>
668: 
669:         <span class="ruby-ivar">@iv</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">cipher</span>.<span class="ruby-identifier">pack</span>(<span class="ruby-value str">&quot;C*&quot;</span>)
670:       <span class="ruby-keyword kw">end</span>
</pre>
          </div>
        </div>
      </div>


    </div>


  </div>


<div id="validator-badges">
  <p><small><a href="http://validator.w3.org/check/referer">[Validate]</a></small></p>
</div>

</body>
</html>